{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 🎯 Uplift model selection"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#  [MegaFon Uplift Competition](https://ods.ai/competitions/megafon-df21-comp)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## problem: predict the uplift by user's feature vector"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-09T22:36:25.634993Z",
     "start_time": "2021-08-09T22:36:25.630910Z"
    }
   },
   "outputs": [],
   "source": [
    "pip install scikit-uplift lightgbm -U"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-09T22:36:28.529257Z",
     "start_time": "2021-08-09T22:36:26.514166Z"
    }
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "from sklearn.model_selection import (\n",
    "    StratifiedShuffleSplit, GridSearchCV, \n",
    "    train_test_split, cross_validate, cross_val_score\n",
    ")\n",
    "from lightgbm import LGBMClassifier\n",
    "from sklift.models import SoloModel\n",
    "from sklift.viz import plot_qini_curve\n",
    "from sklift.datasets import fetch_megafon\n",
    "from sklift.metrics import make_uplift_scorer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-09T22:36:37.602085Z",
     "start_time": "2021-08-09T22:36:28.531896Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>X_1</th>\n",
       "      <th>X_2</th>\n",
       "      <th>X_3</th>\n",
       "      <th>X_4</th>\n",
       "      <th>X_5</th>\n",
       "      <th>X_6</th>\n",
       "      <th>X_7</th>\n",
       "      <th>X_8</th>\n",
       "      <th>X_9</th>\n",
       "      <th>X_10</th>\n",
       "      <th>...</th>\n",
       "      <th>X_41</th>\n",
       "      <th>X_42</th>\n",
       "      <th>X_43</th>\n",
       "      <th>X_44</th>\n",
       "      <th>X_45</th>\n",
       "      <th>X_46</th>\n",
       "      <th>X_47</th>\n",
       "      <th>X_48</th>\n",
       "      <th>X_49</th>\n",
       "      <th>X_50</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>id</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>39.396577</td>\n",
       "      <td>-0.186548</td>\n",
       "      <td>19.524505</td>\n",
       "      <td>21.250208</td>\n",
       "      <td>55.291264</td>\n",
       "      <td>182.966712</td>\n",
       "      <td>-5.385606</td>\n",
       "      <td>144.573379</td>\n",
       "      <td>-12.534344</td>\n",
       "      <td>-58.279429</td>\n",
       "      <td>...</td>\n",
       "      <td>90.877638</td>\n",
       "      <td>134.363458</td>\n",
       "      <td>-213.584582</td>\n",
       "      <td>-2.092461</td>\n",
       "      <td>-93.973258</td>\n",
       "      <td>-0.155597</td>\n",
       "      <td>-312.130733</td>\n",
       "      <td>44.798182</td>\n",
       "      <td>-125.682413</td>\n",
       "      <td>16.231365</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>38.987694</td>\n",
       "      <td>0.819522</td>\n",
       "      <td>-42.064512</td>\n",
       "      <td>-48.270949</td>\n",
       "      <td>-33.171257</td>\n",
       "      <td>179.459341</td>\n",
       "      <td>-87.151810</td>\n",
       "      <td>-162.693257</td>\n",
       "      <td>20.651652</td>\n",
       "      <td>181.635081</td>\n",
       "      <td>...</td>\n",
       "      <td>-183.840746</td>\n",
       "      <td>72.864779</td>\n",
       "      <td>559.783584</td>\n",
       "      <td>1.142391</td>\n",
       "      <td>80.037124</td>\n",
       "      <td>-1.216185</td>\n",
       "      <td>-111.473936</td>\n",
       "      <td>-127.737977</td>\n",
       "      <td>-117.501171</td>\n",
       "      <td>10.732234</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-16.693093</td>\n",
       "      <td>1.844558</td>\n",
       "      <td>-8.615192</td>\n",
       "      <td>-18.818740</td>\n",
       "      <td>-22.271188</td>\n",
       "      <td>-116.290369</td>\n",
       "      <td>-63.816746</td>\n",
       "      <td>-38.340763</td>\n",
       "      <td>24.968496</td>\n",
       "      <td>-136.340629</td>\n",
       "      <td>...</td>\n",
       "      <td>-203.637766</td>\n",
       "      <td>2.480242</td>\n",
       "      <td>96.998504</td>\n",
       "      <td>1.100962</td>\n",
       "      <td>-33.275159</td>\n",
       "      <td>0.920926</td>\n",
       "      <td>-679.492242</td>\n",
       "      <td>-91.009397</td>\n",
       "      <td>-18.173358</td>\n",
       "      <td>14.367636</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-72.040154</td>\n",
       "      <td>-0.226921</td>\n",
       "      <td>39.802607</td>\n",
       "      <td>16.441262</td>\n",
       "      <td>-1.112509</td>\n",
       "      <td>68.128008</td>\n",
       "      <td>23.073147</td>\n",
       "      <td>4.688858</td>\n",
       "      <td>-49.383641</td>\n",
       "      <td>-91.866107</td>\n",
       "      <td>...</td>\n",
       "      <td>172.906875</td>\n",
       "      <td>83.951551</td>\n",
       "      <td>-323.642557</td>\n",
       "      <td>-0.369182</td>\n",
       "      <td>93.221948</td>\n",
       "      <td>-1.962380</td>\n",
       "      <td>-442.466684</td>\n",
       "      <td>-22.298302</td>\n",
       "      <td>-75.916603</td>\n",
       "      <td>11.634299</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>18.296973</td>\n",
       "      <td>0.996437</td>\n",
       "      <td>24.465307</td>\n",
       "      <td>-34.151971</td>\n",
       "      <td>24.623458</td>\n",
       "      <td>-155.455558</td>\n",
       "      <td>-12.159787</td>\n",
       "      <td>26.705778</td>\n",
       "      <td>105.864805</td>\n",
       "      <td>258.607252</td>\n",
       "      <td>...</td>\n",
       "      <td>125.577535</td>\n",
       "      <td>-208.531112</td>\n",
       "      <td>118.902324</td>\n",
       "      <td>-0.808578</td>\n",
       "      <td>-117.497906</td>\n",
       "      <td>1.770635</td>\n",
       "      <td>627.395611</td>\n",
       "      <td>122.019189</td>\n",
       "      <td>194.091195</td>\n",
       "      <td>-11.883858</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 50 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          X_1       X_2        X_3        X_4        X_5         X_6  \\\n",
       "id                                                                     \n",
       "0   39.396577 -0.186548  19.524505  21.250208  55.291264  182.966712   \n",
       "1   38.987694  0.819522 -42.064512 -48.270949 -33.171257  179.459341   \n",
       "2  -16.693093  1.844558  -8.615192 -18.818740 -22.271188 -116.290369   \n",
       "3  -72.040154 -0.226921  39.802607  16.441262  -1.112509   68.128008   \n",
       "4   18.296973  0.996437  24.465307 -34.151971  24.623458 -155.455558   \n",
       "\n",
       "          X_7         X_8         X_9        X_10  ...        X_41  \\\n",
       "id                                                 ...               \n",
       "0   -5.385606  144.573379  -12.534344  -58.279429  ...   90.877638   \n",
       "1  -87.151810 -162.693257   20.651652  181.635081  ... -183.840746   \n",
       "2  -63.816746  -38.340763   24.968496 -136.340629  ... -203.637766   \n",
       "3   23.073147    4.688858  -49.383641  -91.866107  ...  172.906875   \n",
       "4  -12.159787   26.705778  105.864805  258.607252  ...  125.577535   \n",
       "\n",
       "          X_42        X_43      X_44        X_45      X_46        X_47  \\\n",
       "id                                                                       \n",
       "0   134.363458 -213.584582 -2.092461  -93.973258 -0.155597 -312.130733   \n",
       "1    72.864779  559.783584  1.142391   80.037124 -1.216185 -111.473936   \n",
       "2     2.480242   96.998504  1.100962  -33.275159  0.920926 -679.492242   \n",
       "3    83.951551 -323.642557 -0.369182   93.221948 -1.962380 -442.466684   \n",
       "4  -208.531112  118.902324 -0.808578 -117.497906  1.770635  627.395611   \n",
       "\n",
       "          X_48        X_49       X_50  \n",
       "id                                     \n",
       "0    44.798182 -125.682413  16.231365  \n",
       "1  -127.737977 -117.501171  10.732234  \n",
       "2   -91.009397  -18.173358  14.367636  \n",
       "3   -22.298302  -75.916603  11.634299  \n",
       "4   122.019189  194.091195 -11.883858  \n",
       "\n",
       "[5 rows x 50 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataset = fetch_megafon()\n",
    "data, treatment, target = dataset.data, dataset.treatment, dataset.target\n",
    "data = data.set_index('id')\n",
    "\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-09T22:36:37.612740Z",
     "start_time": "2021-08-09T22:36:37.605841Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0      control\n",
       "1      control\n",
       "2    treatment\n",
       "3    treatment\n",
       "4    treatment\n",
       "Name: treatment_group, dtype: object"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "treatment.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-09T22:36:37.625552Z",
     "start_time": "2021-08-09T22:36:37.616897Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0\n",
       "1    0\n",
       "2    0\n",
       "3    0\n",
       "4    0\n",
       "Name: conversion, dtype: int64"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "target.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 📝Solution of problem"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-09T22:36:37.707170Z",
     "start_time": "2021-08-09T22:36:37.628978Z"
    }
   },
   "outputs": [],
   "source": [
    "# make treatment binary\n",
    "treatment = treatment.map({'control': 0, 'treatment': 1})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1) Conditional Independence Assumption:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "intuition: check if treatment was random"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-09T22:37:01.986874Z",
     "start_time": "2021-08-09T22:36:37.711818Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "F1 micro 0.50\n"
     ]
    }
   ],
   "source": [
    "f1_micro = cross_val_score(\n",
    "    X=data,\n",
    "    y=treatment,\n",
    "    estimator= LGBMClassifier(random_state=42, n_jobs=-1),\n",
    "    scoring='f1_micro', \n",
    "    cv=3)\n",
    "\n",
    "print(f'F1 micro {f1_micro.mean():.2f}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Based on the user's features, the classifier makes type I and type II errors as often (50%) as it guesses the correct answer. This means that communication was carried out by random."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2) Fit single model with treatment feature (S-Learner approach) ([link to tutorial](https://habr.com/ru/company/ru_mts/blog/485980/))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "intuition: the model fits simultaneously on two groups with binary treatment flag as an additional user's feature. We score each object from the test sample twice: with the treatment flag equal to 1 and equal to 0. Subtracting the probabilities for each observation, we obtain an estimated uplift."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-09T22:37:06.722450Z",
     "start_time": "2021-08-09T22:37:01.995217Z"
    }
   },
   "outputs": [],
   "source": [
    "# setting up data\n",
    "# use test set for model evaluation after grid-search-cross-validation-tuning \n",
    "# use cv set for GridSearchCV\n",
    "\n",
    "stratify_cols = pd.concat([treatment, target], axis=1)\n",
    "\n",
    "X_cv, X_test, y_cv, y_test, trmnt_cv, trmnt_test = train_test_split(\n",
    "    data,\n",
    "    target,\n",
    "    treatment,\n",
    "    stratify=stratify_cols,\n",
    "    test_size=0.2,\n",
    "    random_state=42\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-09T22:37:06.732922Z",
     "start_time": "2021-08-09T22:37:06.726210Z"
    }
   },
   "outputs": [],
   "source": [
    "# setting up model ...\n",
    "estimator = LGBMClassifier(\n",
    "    random_state=42,\n",
    "    n_jobs=-1,\n",
    ")\n",
    "\n",
    "# ... metamodel ...\n",
    "slearner = SoloModel(estimator=estimator)\n",
    "\n",
    "# ... and uplift metric scorer to pass to cross validation\n",
    "uplift_scorer = make_uplift_scorer(\"qini_auc_score\", trmnt_cv)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-09T22:37:45.899995Z",
     "start_time": "2021-08-09T22:37:06.737907Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'fit_time': array([33.87235594, 33.96732211, 33.46848416]),\n",
       " 'score_time': array([1.76540208, 1.70858002, 1.79931688]),\n",
       " 'estimator': [SoloModel(estimator=LGBMClassifier(random_state=42)),\n",
       "  SoloModel(estimator=LGBMClassifier(random_state=42)),\n",
       "  SoloModel(estimator=LGBMClassifier(random_state=42))],\n",
       " 'test_score': array([0.22895519, 0.22294613, 0.22625875])}"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cv_gen = StratifiedShuffleSplit(\n",
    "    n_splits=3,\n",
    "    random_state=42\n",
    ")\n",
    "\n",
    "cross_validate(slearner,    \n",
    "               X=X_cv,\n",
    "               y=y_cv,\n",
    "               scoring=uplift_scorer,\n",
    "               return_estimator=True,\n",
    "               cv=cv_gen,\n",
    "               n_jobs=-1,\n",
    "               fit_params={'treatment': trmnt_cv}\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-09T22:38:44.842022Z",
     "start_time": "2021-08-09T22:37:45.907215Z"
    }
   },
   "outputs": [],
   "source": [
    "grid = {\n",
    "    'estimator__learning_rate': [0.2],\n",
    "    'estimator__max_depth': [6]\n",
    "}\n",
    "\n",
    "grid_search = GridSearchCV(slearner,\n",
    "                           param_grid=grid,\n",
    "                           scoring=uplift_scorer,\n",
    "                           n_jobs=-1,\n",
    "                           cv=cv_gen,\n",
    "                           return_train_score=True\n",
    "                          )\n",
    "\n",
    "grid_search = grid_search.fit(\n",
    "    X=X_cv,\n",
    "    y=y_cv,\n",
    "    treatment=trmnt_cv\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-09T22:38:44.860816Z",
     "start_time": "2021-08-09T22:38:44.847274Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best qini score on grid search: 0.2269\n",
      "best params: {'estimator__learning_rate': 0.2, 'estimator__max_depth': 6}\n"
     ]
    }
   ],
   "source": [
    "print(f\"best qini score on grid search: {grid_search.best_score_:.4f}\")\n",
    "print(f\"best params: {grid_search.best_params_}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-09T22:38:55.258438Z",
     "start_time": "2021-08-09T22:38:44.865374Z"
    }
   },
   "outputs": [],
   "source": [
    "slearner.set_params(**grid_search.best_params_)\n",
    "\n",
    "slearner.fit(\n",
    "    X=X_cv, \n",
    "    y=y_cv, \n",
    "    treatment=trmnt_cv,\n",
    ")\n",
    "\n",
    "uplift = slearner.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-08-09T22:38:55.910003Z",
     "start_time": "2021-08-09T22:38:55.261034Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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1XV1dRIbGxt0PZTV3PQgpbWlFNUUNQ1nG2N6NneS20ZuOtBnn30W7fP5GDRokPf0008vf/zxxweUlZW5ADZt2hSxffv28MLCwoj4+Hjfj370o33XXHPNrs8//zwWIC4urjHQ90icdNJJFUuWLEnxer3s2LEj/OOPP+534oknVs2YMaOpffPmzREfffRRPMDEiRNr9+3bF/7GG2/Egf+H98qVK6MPd49Ro0bV5uXlRYF/5KeqqiqsqKhozfbt29du37597ZVXXrnrscceSwGYOnVqxd///vcUgMrKSnn++eeTZ8+eXQFw/fXX77rpppvSt2zZEg5QW1srf/rTnwYceL8FCxbs27Bhw/oDHwcmNgAzZsyoKiwsjN6wYUNkbW2tPPfccynnnHNO6YH9Pvjgg5irrrpq2IsvvpiflpbWNAq1cePGiMrKSgEoLi4O++STT/qNGzeuFvyjWsXFxRGjRo2qC+7fho3c9CiB3/DcyZbcGNMbuJPdvFb4GhX1FcRHxoc6nB4pUHMDoKosWrSoMDw8nLPPPrt83bp10cccc8xogNjYWN8TTzyxacOGDVE33XRTusvlIjw8XO+7777NABdffPGe0047LWfQoEH1K1asyGtrHBdddFHphx9+2G/MmDHjRERvv/32bZmZmd6LLrqo9M0330zIzs4eP3To0LrJkydXgn8k6Omnn974k5/8JLOioiKssbFRFixYsDs3N7f2UPeYO3du2aJFi1KvueaaPY899ljKGWecsd9S8fPPP7/kggsuGHHPPffsXLRo0dbvf//7w/7+978PUlXOP//8vYHl49/+9rfLdu3aFT5r1qxRqoqIcOGFF7aroDgiIoI//vGPW0477bScxsZGvvOd7+wJfJef/exnQ4855piqCy+8sOznP/95RnV1ddj8+fNHAgwdOrT+rbfeyl+zZk3MDTfckC4iqCpXXnnlrmOPPbYG4P3334+dPHlyVURE8KsKxb8Ku+/Izc3VlStXhjqMI/LEl09w58d38ub8NxkYO7D1C4wx3dryrcu56q2rWHz6YiYPnBzqcA5LRFap6n47Dq5evbpw0qRJ7fqhaNpmypQpo5YuXZo/YMCAoPd86ekuvfTSjLPOOqt03rx5B02jrV69esCkSZOyDmy3aakexFPiITEqkdQYO0LCmN4gMAprU1MmWHffffe2jRs3Rrbes/cY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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "bets_disp = plot_qini_curve(y_test, uplift, trmnt_test, perfect=True, name='Best model');\n",
    "bets_disp.figure_.suptitle(\"Qini curve\");"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
